#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>

// getchar这个函数的返回值是从键盘所得的字符数

//while和switch有一个不同是，while和switch后面的括号()对下面大括号{}中的变量
//参数变化反应不同，while的判断语句中会不停的更新变化的参数比如在判断语句中
//有变量i，当while下面的大括号{}中也有变量i，若i会随着循环体的执行而变化
//执行的判断语句也是不同的
//但switch的后面的括号()中的变量n  不会随着下面大括号{}中变量n的变化而变化
//也就是case语句执行的过程中如果改变了n也不会从switch中跳到其他case

//int main()
//{
//    int i = 1;//
//    while (i <= 10)//循环体执行完4次以后,i从1自增到5，再进行判断小于10
//        //继续进入循环体，判断if语句，等于5,将会执行continue，之后
//        //然后跳过本次循环中同时满足下面条件的语句，1、处在while循环体中
//        //2、continue之后的语句，然后i就会不自增，直接进入while判断语句中
//        //也就是continue跳过本次循环后面的代码，直接进行while的判断语句	
//    {
//        if (5 == i)
//        {
//            continue;//
//        }
//        printf("%d ", i);//
//        i++;//
//    }
//    return 0;//
//}//这个程序会一直停留在打印完1 2 3 4 之后,一直都不会结束整个程序,到不了return 0;
//对于下面这个代码


//int main()
//{
//    int i = 1;//
//    while (i <= 10)
//    {
//        i++;//
//        if (5 == i)
//        {
//            continue;//
//        }
//        printf("%d ", i);//
//    }
//    return 0;//
//}//这个程序的结果是2 3 4 6 7 8 9 10 11


//int main()
//{
//    int ch = 0;//
//    while ((ch = getchar()) != EOF)//getchar的参数是需要键盘输入的
//        //也就是在程序运行的过程中键入一个字符类型的数据作为这个函数的输入值
//        //而getchar这个函数的返回值的数据类型实际上有两种
//        //1、字符型  2、EOF
//        //只有在运行界面键入 ctrl + z, 才能返回EOF(即-1),
//
//        //所以要创造的变量不只要能放得下字符型(ASCII)数据，还要放得下EOF,其值为-1
//        //所以在建立变量来接收返回值时，可以把这个变量设立为整型
//        //这条指令中while的判断语句是对getchar的返回值进行判断，
//        //当键入一个字符时，执行下面的循环体
//    {
//        putchar(ch);//putchar的参数是一个与getchar配合的函数
//        //结果是打印一个ch里放的内容，在此种情况下和printf ("%c\n", ch);的效果是一样的
//    }
//    return 0;
//}

//下面的程序实际上是由两个程序改进而来,
//程序1见：第108行到120行
//程序2见：第146行到167行

// 对   getchar();   的说明：
// getchar();会一次一次的取出输入缓冲区的内容，直到输入缓冲区没有任何内容
// 当输入缓冲区没有任何内容，写一句   getchar();  
// 会让程序一直等待下一次用户的输入
//
// 要想让缓冲区没有任何内容，以此来等待用户输入
// 就可以通过循环，利用getchar "一次一次的取出输入缓冲区的内容"  这一特性
// 将缓冲区的所有内容都取完
int main()
{
    char password[20] = { 0 };//
    printf("请输入密码\n");//
    scanf("%s", password);
    int ch = 0;//函数返回值的结果要用变量接收
    //这里getchar的返回值利用一个整型变量接收
    while ((ch = getchar()) != '\n')//先执行将输入缓冲区的头一个字符给ch
    //然后进行判断是否等于\n，getchar一次只能获得一个字符，而且对于getchar来说 
    {
        ;
    }
    printf("请确认密码(Y/N):");//用户自己看着自己刚刚写的密码，按下Y确认，
    int ret = getchar();//由于此时输入缓冲区没有任何内容，程序运行时
    //会停留在请确认密码(Y/N):后面进行光标闪烁，当确认符合时，打印Yes
    if ('Y' == ret)
    {
        printf("Yes\n");//
    }
    else
    {
        printf("No\n");//
    }
    return 0;//
}

//程序1：
// 对  scanf("%s", password);  的说明：
// 如果键入abc\n，则password这个字符数组得到 abc
// 如果键入abc def，则password这个字符数组得到 abc
// 
//缺陷：由于scanf既不会读取空格，也不会读取\n，
//即scanf不会从输入缓冲区拿走这两种字符，
//但是用户输入完自己的密码之后必须敲下换行符'\n'，
//所以此时本来作为用户确认按键的换行符被留在了缓冲区
//打印完   请确认密码(Y / N) :  这几个字后，
//然而，getchar(); 在读取到空格  \n这两种字符时，都会从输入缓冲区拿走这两种字符
//所以作为用户确认按键的换行符在通过   执行int ret = getchar();
//使得ret得到 '\n'  则继续执行判断，在程序界面打印  NO

//int main()
//{
//    char password[20] = { 0 };
//    printf("请输入密码\n");//
//    scanf("%s", password);//键入一串字符用%s，
//    //现假设输入了一串如abcedf ghi\n的字符，
//
//    printf("请确认密码(Y/N):");
//    int ret = getchar();
//    if ('Y' == ret)
//    {
//        printf("Yes\n");//
//    }
//    else
//    {
//        printf("No\n");//
//    }
//    return 0;//
//}

//程序2：
//比起程序1的进步：虽然输入缓冲区的 '\n' 不会直接让程序打印 NO
//新的缺陷：如果用户的密码是：123 9
//留在缓冲区的是 '空格' 和 9，
//此时作为用户密码的 '空格' 在通过   执行int ret = getchar();
//使得ret得到 '空格'  则继续执行判断，在程序界面打印  NO
//int main()
//{
//    char password[20] = { 0 };//
//    printf("请输入密码\n");//
//    scanf("%s", password);
//
//    getchar();
//
//    printf("请确认密码(Y/N):");
//    int ret = getchar();
//    if ('Y' == ret)
//    {
//        printf("Yes\n");//
//    }
//    else
//    {
//        printf("No\n");//
//    }
//    return 0;//
//}

//int main()
//{
//    char ch = '\0';//
//    while ((ch = getchar()) != EOF)
//    {
//        if (ch < '0' || ch > '9')
//        {
//            continue;//
//        }
//        putchar(ch);//
//    }
//    return 0;//
//}//如果键入abcd1234ert，则打印的结果是1234